package com.ejuornal.util;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
/**    
 * 项目名称：libraryshare    
 * 类名称：GenericsUtils    
 * 类描述：   普通工具类（主要应用反射技术实现获取类） 
 * 创建人：陈晨    
 * 创建时间：Nov 15, 2012 3:02:59 PM    
 * 修改人：陈晨    
 * 修改时间：Nov 15, 2012 3:02:59 PM    
 * 修改备注：    
 * @version     
 *
 */
public class GenericsUtils {
    /**
     * getSuperClassGenricType 通过反射,获得指定类的父类的泛型参数的实际类型      
     * @param  clazz 需要反射的类,该类必须继承范型父类
     * @param index 泛型参数所在索引,从0开始. 
     * @param  @return    范型参数的实际类型, 如果没有实现ParameterizedType接口，即不支持泛型，所以直接返回
     * @since  CodingExample　Ver(编码范例查看) 1.1
     */
    @SuppressWarnings("rawtypes")
    public static Class getSuperClassGenricType(Class clazz, int index) {    
        Type genType = clazz.getGenericSuperclass();//得到泛型父类  
        //如果没有实现ParameterizedType接口，即不支持泛型，直接返回Object.class   
        if (!(genType instanceof ParameterizedType)) {
            return Object.class;   
        }  
        //返回表示此类型实际类型参数的Type对象的数组,数组里放的都是对应类型的Class, 如BuyerServiceBean extends DaoSupport<Buyer,Contact>就返回Buyer和Contact类型   
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();                   
        if (index >= params.length || index < 0) { 
             throw new RuntimeException("你输入的索引"+ (index<0 ? "不能小于0" : "超出了参数的总数"));
        }      
        if (!(params[index] instanceof Class)) {
            return Object.class;   
        }   
        System.out.println(params[index]);
        return (Class) params[index];
    }
    
    @SuppressWarnings("rawtypes")
    public static Class getSuperClassGenricType(Class clazz) {
        return getSuperClassGenricType(clazz,0);
    }
}
